package lanqiao.真题.第13届决赛JavaB组;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 *【问题描述】
 * 小蓝有N个小球，编号1至N。其中N-1是正品，重量相同：有1个是次品，重量比正品轻。
 * 为了找出次品，小蓝已经用天平进行了M次称重，并且记录下来每次两边放的小球编号，和称重结果。
 * 请你根据记录，判断还剩下几个小球有次品的嫌疑。
 * 【输入格式】
 * 第一行包含2个整数N和M。
 * 以下包含M次称重记录，每个记录占4行。
 * 第一行是一个整数K,表示天平两边各放了K个小球。
 * 第二行包含K个整数，代表放在天平左边的小球编号。
 * 第三行包含K个整数，代表放在天平右边的小球编号。
 * 第四行是一个字符，为'>’，‘<'，=’之一。'>’代表左边比右边重，‘<’代表左边比右边轻，=’代表两边重量相等。
 * 在一次称重中保证每个小球最多出现1次。

 * 【输出格式】
 * 输出一个整数，代表答案。
 * 【样例输入】
 * 10	2
 * 3
 * 1	2	3
 * 4	5	6
 * <
 * 2
 * 3	7
 * 8	9
 * =
 * 【样例输出】
 * 2
 * 【样例说明】
 * {1,2,3}<{4,5,6}能判断出次品在{1,2,3}之中。
 * {3,7}={8,9}能判断出3不可能是次品。
 * 所以只剩下{1,2}可能是次品。
 * 【评测用例规模与约定】
 * 对于40%的数据，1≤N≤10^6^；
 * 对于100%的数据，1≤N≤10^9^，1≤M≤10^5^，参与M次称重的小球总数≤10^6^
 * @since 2023-06-01 16:31
 */
public class F_小球称重 {
}
class MainF{
    static int n, m;
    //有嫌疑的
    static Set<Integer> setWrong = new HashSet<>();

    //正品
    static Set<Integer> setRight = new HashSet<>();
    //左边
    static List<Integer> left = new ArrayList<>();
    //右边
    static List<Integer> right = new ArrayList<>();
/*
IN:
10	2
3
1	2	3
4	5	6
<
2
3	7
8	9
=
OUT:
2
*/
    public static void main(String[] args) throws IOException {
        IR sc = new IR();
        n = sc.nextInt();
        m = sc.nextInt();
        int k;
        /*
        标记是否出现 < 或 >
        true : 未出现的小球都是正品
        false : 未出现的小球有次品嫌疑
         */
        boolean flag = false;
        String op;
        for(int i = 0; i < m; i++){
            k = sc.nextInt();
            for(int j = 0; j < k; j++){
                left.add(sc.nextInt());
            }
            for(int j = 0; j < k; j++){
                right.add(sc.nextInt());
            }
            op = sc.next();
            if(op.equals("=")){
                setRight.addAll(left);
                setRight.addAll(right);
            }else if(op.equals("<")){
                flag = true;
                setWrong.addAll(left);
            }else{  // >
                flag = true;
                setWrong.addAll(right);
            }
            //清空
            left.clear();
            right.clear();
        }
        if(!flag){
            System.out.println(n - setRight.size());
        }else{
            setWrong.removeAll(setRight);
            System.out.println(setWrong.size());
        }
    }
    static class IR{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer("");
        String next() throws IOException {
            if(!tokenizer.hasMoreTokens()){
                tokenizer = new StringTokenizer(reader.readLine());
            }
            return tokenizer.nextToken();
        }
        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }
    }
}
